package com.punch.order.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.punch.common.dto.course.ClassStartDTO;
import com.punch.common.dto.order.OrderCancelDTO;
import com.punch.common.dto.order.OrderDTO;
import com.punch.common.dto.order.SimpleOrderDTO;
import com.punch.common.page.PageInfo;
import com.punch.common.query.order.OrderQueryInfo;
import com.punch.common.vo.order.*;
import com.punch.common.vo.pay.WXPayVO;
import com.punch.order.model.Order;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * 订单service
 *
 * @author Liang
 */
public interface OrderService extends IService<Order> {

//    /**
//     * 下单前进行验证
//     *
//     * @param courseClassId 课程id
//     * @param studentId     学生id
//     * @param studentName   学生姓名
//     * @param coursePrice   课程价格
//     * @return 是否有资格报名
//     */
//    Boolean validateOrder(Long courseClassId, Long studentId, String studentName, BigDecimal coursePrice);

    /**
     * 创建订单
     *
     * @param orderDTO 订单表单
     * @return 订单id
     */
    WXPayVO createOrder(OrderDTO orderDTO, HttpServletRequest request);

    /**
     * 查询家长下的订单信息列表
     *
     * @param orderQueryInfo 查询条件
     * @return PageInfo<OrderAppPageVO>
     * @author xiaol
     * @since 2020/7/23
     */
    PageInfo<OrderAppPageVO> listAppOrder(OrderQueryInfo orderQueryInfo);

    /**
     * 获取订单详情
     *
     * @param orderId 订单id
     * @return OrderAppDetailVO
     */
    OrderAppDetailVO getAppOrder(Long orderId);

    /**
     * 订单列表
     *
     * @param orderQueryInfo 查询条件
     * @return OrderPageVO订单信息
     * @author wujj
     * @since 2020/9/17 13:16
     */
    PageInfo<OrderPageVO> listOrder(OrderQueryInfo orderQueryInfo);

    /**
     * 订单详情
     *
     * @param orderId 订单id
     * @return OrderDetailVO
     * @author wujj
     * @since 2020/9/17 16:25
     */
    OrderDetailVO getOrder(Long orderId);


    /**
     * 获取用户订单状态统计
     *
     * @return map
     */
    Map<String, Integer> getOrderStatusCount();

    /**
     * 支付回调成功，完成订单状态
     *
     * @param wxTransactionId 微信支付交易号
     * @param orderNo         订单号
     */
    void finishOrder(String wxTransactionId, String orderNo, String callBackStr);

    /**
     * 开班修改订单状态
     *
     * @param classStartDTO 开课信息
     * @return 是否成功
     */
    boolean startClass(ClassStartDTO classStartDTO);

    /**
     * 修改订单状态
     *
     * @param order     订单信息
     * @param optRemark 备注信息
     */
    void updateOrderStatus(Order order, String optRemark, String infoRemarks);

    /**
     * 待支付订单进行支付
     *
     * @param orderId 订单id
     * @return 支付回调信息
     */
    WXPayVO payOrder(Long orderId, HttpServletRequest request);

    /**
     * 获取开班课程的报名学生id列表
     *
     * @param courseClassId 班级id
     * @return 学生id列表
     */
    List<StudentCourseClassVO> getCourseClassOrderStudent(Long courseClassId);

    /**
     * 订单取消,已支付订单取消
     *
     * @param orderCancelDTO 取消订单信息
     * @return ""
     */
    Long cancelPayOrder(OrderCancelDTO orderCancelDTO);

    /**
     * 订单取消,未支付订单取消
     *
     * @param orderId 订单id
     * @return ""
     */
    Long cancelUnPayOrder(Long orderId);

    /**
     * 后台管理系统创建订单
     *
     * @param simpleOrderDTO 订单信息
     * @return orderId
     * @author xiaol
     * @since 2020/8/3
     */
    Long createOrderByBack(SimpleOrderDTO simpleOrderDTO);

}
